package org.example.designPattern.proxyPattern2;

//运行测试类
public class Test {
    public static void main(String[] args) {
        //缺点：每个需要代理的对象都需要自己重复编写代理，很不舒服，
        //优点：但是可以面相实际对象或者是接口的方式实现代理
//        UserDao userDao = new UserDao();
//        userDao.save();

//        UserDao userDao = new UserDao();
//        UserDaoProxy userDaoProxy = new UserDaoProxy(userDao);
//        userDaoProxy.save();
/*
            动态代理也叫做，JDK代理、接口代理。
            动态代理的对象，是利用JDK的API，动态的在内存中构建代理对象（是根据被代理的接口来动态
            生成代理类的class文件，并加载运行的过程），这就叫动态代理

 */

        // 被代理对象
//        UserDao1 userDaoImpl = new UserDaoImpl();
//        InvocationHandlerImpl invocationHandlerImpl = new
//                InvocationHandlerImpl(userDaoImpl);
////类加载器
//        ClassLoader loader = userDaoImpl.getClass().getClassLoader();
//        Class<?>[] interfaces = userDaoImpl.getClass().getInterfaces();
//// 主要装载器、一组接口及调用处理动态代理实例
//        UserDao1 newProxyInstance = (UserDao1) Proxy.newProxyInstance(loader,
//                interfaces, invocationHandlerImpl);
//        newProxyInstance.save();


        //利用asm开源包，对代理对象类的class文件加载进来，通过修改其字节码生成子类来处理。
        CglibProxy cglibProxy = new CglibProxy();
        UserDao1 userDao = (UserDao1) cglibProxy.getInstance(new UserDaoImpl());
        userDao.save();
    }

}
